#include "GastoMensualModule.h"

extern QSqlDatabase enjoylifedb;

extern QString current_user;
extern QString user_pablo;
extern QString user_lucas;
extern QString user__diego;

extern GMSqlTableModel *gasto_mes_model;
extern QTableView *gasto_mes_view;

QLineEdit *gasto_mes_edit;
QLineEdit *deuda_mes_edit;
QLineEdit *gasto_mes_pablo_edit;
QLineEdit *gasto_mes_lucas_edit;
QLineEdit *gasto_mes_diego_edit;
QLineEdit *debe_pablo_edit;
QLineEdit *debe_lucas_edit;
QLineEdit *debe_diego_edit;

GastoMensualModule::GastoMensualModule(QWidget *parent) :
    QMainWindow(parent)
{
    gasto_mes_toolbar = new CustomModulesToolbar(this);
    addToolBar(gasto_mes_toolbar);
    AltaGastoMensualToolbar();
    BajaGastoMensualToolbar();
    ModificacionGastoMensualToolbar();
    ActualizarListaToolbar();
    DividirGMToolbar();
    ABMConceptoToolbar();

    gasto_mes_model = new GMSqlTableModel(this,enjoylifedb);
    gasto_mes_model->setTable("gasto_mes");
    gasto_mes_model->setEditStrategy(GMSqlTableModel::OnFieldChange);

    gasto_mes_view = new QTableView(this);
    gasto_mes_view->setModel(gasto_mes_model);

    QWidget *widget_main = new QWidget();
    QWidget *widget_central = new QWidget();
    QWidget *widget_derecho = new QWidget();

    QGridLayout *grid_main = new QGridLayout();
    QGridLayout *grid_central = new QGridLayout();
    QGridLayout *grid_derecho = new QGridLayout();

    QGroupBox *group_gastos = new QGroupBox("Resumen de Gastos",this);
    QGroupBox *group_deudas = new QGroupBox("Resumen de Deudas",this);

    //    QFormLayout *form_filtros = new QFormLayout;
    form_gastos = new QFormLayout;
    form_deuda = new QFormLayout;

    // Gastos
    QLabel *saldo_label1 = new QLabel("Gastos Total Mes Actual $",0);
    saldo_label1->setFixedSize(180,20);
    saldo_label1->setAlignment(Qt::AlignCenter);
    saldo_label1->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_gastos->addRow(saldo_label1);

    gasto_mes_edit = new QLineEdit(this);
    gasto_mes_edit->setFixedSize(180,60);
    gasto_mes_edit->setEnabled(false);
    gasto_mes_edit->setAlignment(Qt::AlignCenter);
    gasto_mes_edit->setStyleSheet("background-color: rgb(0, 139, 56);color: rgb(255, 255, 255);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    form_gastos->addRow(gasto_mes_edit);

    QLabel *saldo_label2 = new QLabel("Gastos de Pablo $",0);
    saldo_label2->setFixedSize(180,20);
    saldo_label2->setAlignment(Qt::AlignCenter);
    saldo_label2->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_gastos->addRow(saldo_label2);

    gasto_mes_pablo_edit = new QLineEdit(this);
    gasto_mes_pablo_edit->setFixedSize(180,60);
    gasto_mes_pablo_edit->setEnabled(false);
    gasto_mes_pablo_edit->setAlignment(Qt::AlignCenter);
    gasto_mes_pablo_edit->setStyleSheet("background-color: rgb(0, 139, 56);color: rgb(255, 255, 255);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    form_gastos->addRow(gasto_mes_pablo_edit);

    QLabel *saldo_label3 = new QLabel("Gastos de Lucas $",0);
    saldo_label3->setFixedSize(180,20);
    saldo_label3->setAlignment(Qt::AlignCenter);
    saldo_label3->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_gastos->addRow(saldo_label3);

    gasto_mes_lucas_edit = new QLineEdit(this);
    gasto_mes_lucas_edit->setFixedSize(180,60);
    gasto_mes_lucas_edit->setEnabled(false);
    gasto_mes_lucas_edit->setAlignment(Qt::AlignCenter);
    gasto_mes_lucas_edit->setStyleSheet("background-color: rgb(0, 139, 56);color: rgb(255, 255, 255);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    form_gastos->addRow(gasto_mes_lucas_edit);

    QLabel *saldo_label4 = new QLabel("Gastos de Diego $",0);
    saldo_label4->setFixedSize(180,20);
    saldo_label4->setAlignment(Qt::AlignCenter);
    saldo_label4->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_gastos->addRow(saldo_label4);

    gasto_mes_diego_edit = new QLineEdit(this);
    gasto_mes_diego_edit->setFixedSize(180,60);
    gasto_mes_diego_edit->setEnabled(false);
    gasto_mes_diego_edit->setAlignment(Qt::AlignCenter);
    gasto_mes_diego_edit->setStyleSheet("background-color: rgb(0, 139, 56);color: rgb(255, 255, 255);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    form_gastos->addRow(gasto_mes_diego_edit);

    QLabel *separador_label = new QLabel("",0);
    separador_label->setFixedSize(200,1);
    separador_label->setAlignment(Qt::AlignCenter);
    separador_label->setStyleSheet("background-color: rgb(255, 255, 255); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
//    form_gastos->addRow(separador_label);

    QLabel *RefLabel = new QLabel("Referencia Pagos",0);
    RefLabel->setFixedSize(200,22);
    RefLabel->setAlignment(Qt::AlignCenter);
    RefLabel->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
//    form_gastos->addRow(RefLabel);

    //
    QPixmap refImage("://Images/Referencia_pagos.png");
    QLabel *imagen_label = new QLabel("",0);
    imagen_label->setPixmap(refImage);
    imagen_label->setFixedSize(200,90);
//    RefLabel->setScaledContents(true);
    imagen_label->setAlignment(Qt::AlignCenter);
//    RefLabel->setAlignment(Qt::AlignHCenter);
//    form_gastos->addRow(imagen_label);

    QLabel *gastosAnt_label = new QLabel("Gastos anteriores",0);
    gastosAnt_label->setFixedSize(200,20);
    gastosAnt_label->setAlignment(Qt::AlignCenter);
    gastosAnt_label->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
//    form_gastos->addRow(gastosAnt_label);

    fecha_gastos_anteriores = new QDateEdit(this);
    fecha_gastos_anteriores->setFixedSize(200,30);
    fecha_gastos_anteriores->setEnabled(true);
    fecha_gastos_anteriores->setStyleSheet("background-color: rgb(200, 200, 200);color: rgb(0, 0, 0);font: 15pt \"Helvetica57-Condensed\";border-style: solid");
    QDate *date_gastos;
    fecha_gastos_anteriores->setDate(date_gastos->currentDate());
//    form_gastos->addRow(fecha_gastos_anteriores);

    // Deudas
    QLabel *saldo_label5 = new QLabel("Deuda Total Mes Actual $",0);
    saldo_label5->setFixedSize(180,20);
    saldo_label5->setAlignment(Qt::AlignCenter);
    saldo_label5->setStyleSheet("background-color: rgb(0, 139, 56);color: rgb(255, 255, 255); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_deuda->addRow(saldo_label5);

    deuda_mes_edit = new QLineEdit(this);
    deuda_mes_edit->setFixedSize(180,60);
    deuda_mes_edit->setEnabled(false);
    deuda_mes_edit->setAlignment(Qt::AlignCenter);
    deuda_mes_edit->setStyleSheet("background-color: rgb(13, 200, 35);color: rgb(0, 0, 0);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    form_deuda->addRow(deuda_mes_edit);


    //    QGroupBox *group_father2 = new QGroupBox("Deudas",this);
    //    form_deuda = new QFormLayout;

    //    monto_deuda_edit = new QLineEdit(this);
    //    monto_deuda_edit->setFixedSize(160,40);
    //    monto_deuda_edit->setEnabled(false);
    //    monto_deuda_edit->setAlignment(Qt::AlignCenter);
    //    monto_deuda_edit->setStyleSheet("background-color: rgb(255, 0, 0);color: rgb(0, 0, 0);font: 28pt \"Helvetica57-Condensed\";border-style: solid");
    //    form_deuda->addRow(monto_deuda_edit);
    //    group_father2->setLayout(form_deuda);
    //    group_father2->setFixedWidth(180);
    //    form_gastos->addRow(group_father2);

    QLabel *saldo_label6 = new QLabel("Debe Pablo $",0);
    saldo_label6->setFixedSize(180,20);
    saldo_label6->setAlignment(Qt::AlignCenter);
    saldo_label6->setStyleSheet("background-color: rgb(0, 139, 56);color: rgb(255, 255, 255); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_deuda->addRow(saldo_label6);

    debe_pablo_edit = new QLineEdit(this);
    debe_pablo_edit->setFixedSize(180,60);
    debe_pablo_edit->setEnabled(false);
    debe_pablo_edit->setAlignment(Qt::AlignCenter);
    debe_pablo_edit->setStyleSheet("background-color: rgb(13, 200, 35);color: rgb(0, 0, 0);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    form_deuda->addRow(debe_pablo_edit);

    QLabel *saldo_label7 = new QLabel("Debe Lucas $",0);
    saldo_label7->setFixedSize(180,20);
    saldo_label7->setAlignment(Qt::AlignCenter);
    saldo_label7->setStyleSheet("background-color: rgb(0, 139, 56);color: rgb(255, 255, 255); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_deuda->addRow(saldo_label7);

    debe_lucas_edit = new QLineEdit(this);
    debe_lucas_edit->setFixedSize(180,60);
    debe_lucas_edit->setEnabled(false);
    debe_lucas_edit->setAlignment(Qt::AlignCenter);
    debe_lucas_edit->setStyleSheet("background-color: rgb(13, 200, 35);color: rgb(0, 0, 0);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    form_deuda->addRow(debe_lucas_edit);

    QLabel *saldo_label8 = new QLabel("Debe Diego $",0);
    saldo_label8->setFixedSize(180,20);
    saldo_label8->setAlignment(Qt::AlignCenter);
    saldo_label8->setStyleSheet("background-color: rgb(0, 139, 56);color: rgb(255, 255, 255); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_deuda->addRow(saldo_label8);

    debe_diego_edit = new QLineEdit(this);
    debe_diego_edit->setFixedSize(180,60);
    debe_diego_edit->setEnabled(false);
    debe_diego_edit->setAlignment(Qt::AlignCenter);
    debe_diego_edit->setStyleSheet("background-color: rgb(13, 200, 35);color: rgb(0, 0, 0);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    form_deuda->addRow(debe_diego_edit);

    //
    QPixmap SITIimage("://Images/SITI-Soft_Logo.png");
    QLabel *SITILabel = new QLabel("",0);
    SITILabel->setPixmap(SITIimage);
    SITILabel->setFixedHeight(180);
    SITILabel->setScaledContents(true);
    SITILabel->setAlignment(Qt::AlignVCenter);
    SITILabel->setAlignment(Qt::AlignHCenter);

    //    // Filtros
    //    QLabel *date_label = new QLabel("Quién Pagó?",0);
    //    date_label->setFixedWidth(180);
    //    date_label->setFixedHeight(20);
    //    date_label->setAlignment(Qt::AlignCenter);
    //    date_label->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    //    form_filtros->addRow(date_label);

    //    pago_lucas = new QRadioButton("Lucas",0);
    //    connect(pago_lucas,SIGNAL(clicked()),this,SLOT(FiltrarGastosLucas()));
    //    form_filtros->addRow(pago_lucas);

    //    pago_pablo = new QRadioButton("Pablo",0);
    //    connect(pago_pablo,SIGNAL(clicked()),this,SLOT(FiltrarGastosPablo()));
    //    form_filtros->addRow(pago_pablo);

    //    QLabel *filter_label = new QLabel("Búsqueda Rápida",0);
    //    filter_label->setFixedWidth(180);
    //    filter_label->setFixedHeight(20);
    //    filter_label->setAlignment(Qt::AlignCenter);
    //    filter_label->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    //    form_filtros->addRow(filter_label);

    //    find_concepto = new QRadioButton("Concepto",0);
    //    connect(find_concepto,SIGNAL(clicked()),this,SLOT(FiltrarConcepto()));
    //    form_filtros->addRow(find_concepto);

    //    find_observacion = new QRadioButton("Observaciones",0);
    //    connect(find_observacion,SIGNAL(clicked()),this,SLOT(FiltrarObservacion()));
    //    form_filtros->addRow(find_observacion);

    //    find_line = new QLineEdit(this);
    //    find_line->setFixedWidth(180);
    //    find_line->setEnabled(false);
    //    form_filtros->addRow(find_line);

    //    QLabel *separador_label = new QLabel("",0);
    //    separador_label->setFixedSize(180,3);
    //    separador_label->setAlignment(Qt::AlignCenter);
    //    separador_label->setStyleSheet("background-color: rgb(255,255,255)");
    //    form_filtros->addRow(separador_label);

    //    QLabel *fecha_label = new QLabel("Gastos Mes...",0);
    //    fecha_label->setFixedSize(180,20);
    //    fecha_label->setAlignment(Qt::AlignCenter);
    //    fecha_label->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    //    form_filtros->addRow(fecha_label);

    //    fecha_gasto = new QDateEdit(this);
    //    fecha_gasto->setFixedSize(180,30);
    //    fecha_gasto->setEnabled(true);
    //    fecha_gasto->setStyleSheet("background-color: rgb(200, 200, 200);color: rgb(0, 0, 0);font: 15pt \"Helvetica57-Condensed\";border-style: solid");
    //    QDate *date;
    //    fecha_gasto->setDate(date->currentDate());
    //    connect(fecha_gasto,SIGNAL(dateChanged(QDate)),this,SLOT(FiltrarGastosFecha()));
    //    form_filtros->addRow(fecha_gasto);

    //    QLabel *separador2_label = new QLabel("",0);
    //    separador2_label->setFixedSize(180,3);
    //    separador2_label->setAlignment(Qt::AlignCenter);
    //    separador2_label->setStyleSheet("background-color: rgb(255,255,255)");
    //    form_filtros->addRow(separador2_label);

    //    QLabel *ref_label = new QLabel("Referencia:",0);
    //    ref_label->setFixedSize(180,20);
    //    ref_label->setAlignment(Qt::AlignCenter);
    //    ref_label->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    //    form_filtros->addRow(ref_label);

    group_gastos->setLayout(form_gastos);
    group_gastos->setFixedWidth(200);
    group_deudas->setLayout(form_deuda);
    group_deudas->setFixedWidth(200);

    grid_central->addWidget(group_gastos,0,0);
//    grid_central->addWidget(separador_label,1,0);
    grid_central->addWidget(gastosAnt_label,1,0);
    grid_central->addWidget(fecha_gastos_anteriores,2,0);
    grid_central->addWidget(RefLabel,3,0);
    grid_central->addWidget(imagen_label,4,0);
    grid_derecho->addWidget(group_deudas,0,0);
    grid_derecho->addWidget(SITILabel,1,0);

    widget_central->setLayout(grid_central);
    widget_central->setFixedWidth(210);
    widget_derecho->setLayout(grid_derecho);
    widget_derecho->setFixedWidth(210);

    grid_main->addWidget(gasto_mes_view,0,0);
    grid_main->addWidget(widget_central,0,1);
    grid_main->addWidget(widget_derecho,0,2);

    widget_main->setLayout(grid_main);
    setCentralWidget(widget_main);

    RefreshModelView();
    ActualizarValoresGastosMes();

    // Doble click sobre un regisro y abre la modificación.
    connect(gasto_mes_view,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(ModificaGastoMesBtn()));
    // Al cambiar la fecha se listan gastos anteriores.
    connect(fecha_gastos_anteriores,SIGNAL(dateChanged(QDate)),this,SLOT(GastosAnteriores()));

    // Definición de acceso directo para agregar un registro mediante la combinacion de teclas "Ctrl + A".
    QShortcut* shortcutAlta = new QShortcut(QKeySequence("Ctrl+A"), this);
    connect(shortcutAlta, SIGNAL(activated()), this, SLOT(AltaGastoMesBtn()));
    // Definición de acceso directo para borrar un registro mediante la tecla "Supr".
    QShortcut* shortcutBaja = new QShortcut(QKeySequence(QKeySequence::Delete), gasto_mes_view);
    connect(shortcutBaja, SIGNAL(activated()), this, SLOT(BajaGastoMesBtn()));
    // Definición de acceso directo para modificar un registro mediante la combinacion de teclas "Ctrl + M".
    QShortcut* shortcutModif = new QShortcut(QKeySequence("Ctrl+M"), gasto_mes_view);
    connect(shortcutModif, SIGNAL(activated()), this, SLOT(ModificaGastoMesBtn()));
    // Definición de acceso directo para actualizr la lista mediante la combinacion de teclas "Ctrl + U".
    QShortcut* shortcutActualizar = new QShortcut(QKeySequence("Ctrl+U"), this);
    connect(shortcutActualizar, SIGNAL(activated()), this, SLOT(ActualizarListaGMBtn()));
    // Definición de acceso directo para dividir gastos mediante la combinacion de teclas "Ctrl + O".
    QShortcut* shortcutCCCA = new QShortcut(QKeySequence("Ctrl+O"), this);
    connect(shortcutCCCA, SIGNAL(activated()), this, SLOT(DividirGMBtn()));
}

void GastoMensualModule::AltaGastoMensualToolbar()
{
    action_alta_mes = new QAction("Alta Gasto Mes",this);
    action_alta_mes->setIcon(QIcon("://Icons/BarraHerramientas/alta48.png"));
    action_alta_mes->setToolTip("Agrega un gasto mensual");
    connect(action_alta_mes,SIGNAL(triggered()),this,SLOT(AltaGastoMesBtn()));

    gasto_mes_toolbar->addAction(action_alta_mes);
}

void GastoMensualModule::BajaGastoMensualToolbar()
{
    action_baja_mes = new QAction("Baja Gasto Mes",this);
    action_baja_mes->setIcon(QIcon("://Icons/BarraHerramientas/baja48.png"));
    action_baja_mes->setToolTip("Borra un gasto mensual");
    connect(action_baja_mes,SIGNAL(triggered()),this,SLOT(BajaGastoMesBtn()));

    gasto_mes_toolbar->addAction(action_baja_mes);
}

void GastoMensualModule::ModificacionGastoMensualToolbar()
{
    action_modifica_mes = new QAction("Modificación Gasto Mes",this);
    action_modifica_mes->setIcon(QIcon("://Icons/BarraHerramientas/modificar48.png"));
    action_modifica_mes->setToolTip("Modifica un gasto mensual");
    connect(action_modifica_mes,SIGNAL(triggered()),this,SLOT(ModificaGastoMesBtn()));

    gasto_mes_toolbar->addAction(action_modifica_mes);
}

void GastoMensualModule::ActualizarListaToolbar()
{
    action_actualizar_mes = new QAction("Actualizar Listado Gasto Mes",this);
    action_actualizar_mes->setIcon(QIcon("://Icons/BarraHerramientas/actualizar48.png"));
    action_actualizar_mes->setToolTip("Actualiza el listado de gasto mensual");
    connect(action_actualizar_mes,SIGNAL(triggered()),this,SLOT(ActualizarListaGMBtn()));

    gasto_mes_toolbar->addSeparator();
    gasto_mes_toolbar->addAction(action_actualizar_mes);

}

void GastoMensualModule::DividirGMToolbar()
{
    action_dividir_gastos = new QAction("Cuentas Claras Conservan Amistad",this);
    action_dividir_gastos->setIcon(QIcon("://Icons/ccca48.png"));
    action_dividir_gastos->setToolTip("Cuentas Claras Conservan Amistad");
    connect(action_dividir_gastos,SIGNAL(triggered()),this,SLOT(DividirGMBtn()));

    gasto_mes_toolbar->addSeparator();
    gasto_mes_toolbar->addAction(action_dividir_gastos);

}

void GastoMensualModule::ABMConceptoToolbar()
{
    action_abmConcepto = new QAction("ABM-Conceptos",this);
    action_abmConcepto->setIcon(QIcon("://Icons/BarraHerramientas/abmConceptos48.png"));
    action_abmConcepto->setToolTip("ABM-Conceptos");
    connect(action_abmConcepto,SIGNAL(triggered()),this,SLOT(ABMConceptoBtn()));

    gasto_mes_toolbar->addSeparator();
    gasto_mes_toolbar->addAction(action_abmConcepto);

}

void GastoMensualModule::AltaGastoMesBtn()
{
    AltaGastoMensual *alta_gasto = new AltaGastoMensual();
    alta_gasto->show();
    RefreshModelView();
    ActualizarValoresGastosMes();
}

void GastoMensualModule::BajaGastoMesBtn()
{
    QModelIndexList selection;
    if (!(gasto_mes_view->currentIndex().row() == -1)) {
        selection.append(gasto_mes_view->currentIndex());
    }

    if (!selection.empty()) {
        QModelIndex idIndex = selection.first();
        QString rs = idIndex.sibling(idIndex.row(), 1).data().toString();

        QMessageBox::StandardButton button;
        button = QMessageBox::question(this, tr("Eleminar Gasto"),
                                       tr("¿Está seguro que quiere "
                                          "eliminar el gasto '%1'?").arg(rs),
                                       QMessageBox::Yes | QMessageBox::No);

        if (button == QMessageBox::Yes) {
            // Se elimina el movimiento seleccionado de la tabla movimiento
            enjoylifedb.transaction();
            if (!gasto_mes_model->removeRow(idIndex.row())) {
                QMessageBox::critical(this,"Error!", "No se pudo eliminar el gasto, vuelva a intentarlo.");
                enjoylifedb.rollback();
                return;
            }
            enjoylifedb.commit();
            QMessageBox::information(this,"Exito!", "El gasto fue eliminado correctamente.",
                                     QMessageBox::Ok);
        }
    }

    RefreshModelView();
    ActualizarValoresGastosMes();
}

void GastoMensualModule::ModificaGastoMesBtn()
{
    // Se controla para el caso que no existan movimientos cargados.
    if (gasto_mes_model->rowCount() == 0) {
        QMessageBox::information(this,"Información!","No hay gastos disponibles.");
        return;
    }

    int selection = -1;
    if (!(gasto_mes_view->currentIndex().row() == -1))
        selection = gasto_mes_view->currentIndex().row();

    if (!(selection == -1)) {
        ModificacionGastoMensual *modif_gasto = new ModificacionGastoMensual();
        modif_gasto->setWindowModality(Qt::WindowModal);
        modif_gasto->GetGastoMensualInfo(selection);
        modif_gasto->show();
    } else {
        QMessageBox::warning(this, tr("Modificar Gasto Mensual"),
                             tr("La operación no se puede concretar."
                                "\nNingún gasto ha sido seleccionado."));
    }

    RefreshModelView();
    ActualizarValoresGastosMes();
}

/**
 * @brief GastoMensualModule::ActualizarListaGMBtn
 * Actualiza el listado del modulo Gasto Mensual y actualiza los valores del resumen.
 */
void GastoMensualModule::ActualizarListaGMBtn()
{
    RefreshModelView();
    ActualizarValoresGastosMes();
}

/**
 * @brief GastoMensualModule::DividirGMBtn
 */
void GastoMensualModule::DividirGMBtn()
{
    QMessageBox::StandardButton button;
    button = QMessageBox::question(this, tr("Cuentas Claras Conservan Amistad!"),
                                   tr("¿Está seguro que quiere realizar esta acción?"),
                                   QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes) {
        QSqlQuery *query = new QSqlQuery(enjoylifedb);
        QString str;
        str.append("select id_gasto_mes,estado from gasto_mes where (estado is null or estado <> 'BAJA')");
        enjoylifedb.transaction();
        if (! query->exec(str)) {
            QMessageBox::critical(this,"Error!", "No se pudo recuperar todos los registros, "
                                                 "intentelo nuevamente || " + query->lastError().text());
            enjoylifedb.rollback();
            return;
        }

        while (query->next()) {
            int id = query->value("id_gasto_mes").toInt();
            enjoylifedb.transaction();
            QSqlQuery *query2 = new QSqlQuery(enjoylifedb);
            QString str2 = "update gasto_mes set estado = 'BAJA' where id_gasto_mes = '" + QString::number(id) + "'";
            if (! query2->exec(str2)) {
                QMessageBox::critical(this,"Error!", "No se pudo eliminar el gastos, "
                                                     "intentelo nuevamente || " + query2->lastError().text());
                enjoylifedb.rollback();
                return;
            }

        }

        enjoylifedb.commit();
        enjoylifedb.commit();


//        QSqlQuery *query = new QSqlQuery(enjoylifedb);
//        QString str;
//        str.append("truncate gasto_mes");

//        if (! query->exec(str)) {
//            QMessageBox::critical(this,"Error en la consulta",query->lastError().text());
//            return;
//        }
        RefreshModelView();
        ActualizarValoresGastosMes();
    }
    else
        return;
}

/**
 * @brief GastoMensualModule::ABMConceptoBtn
 */
void GastoMensualModule::ABMConceptoBtn()
{
    ABMConcepto *abm_concepto = new ABMConcepto();
    abm_concepto->show();
}

/**
 * @brief GastoMensualModule::GastosAnteriores
 */
void GastoMensualModule::GastosAnteriores()
{
    QString fecha_gastos;
    QString formatAnio = "yyyy";
    QString formatMes = "MM";
    QString formatDia = "dd";
    QString anio, mes, dia;
    anio = fecha_gastos_anteriores->date().toString(formatAnio);
    mes = fecha_gastos_anteriores->date().toString(formatMes);
    dia = fecha_gastos_anteriores->date().toString(formatDia);

    fecha_gastos.append(anio).append(mes).append(dia);

    QString filtroFecha;
    filtroFecha.append("fecha_gasto <= '").append(fecha_gastos).append("' and estado = 'BAJA'");
    gasto_mes_model->setTable("gasto_mes");
    gasto_mes_model->filter().clear();
    gasto_mes_model->setFilter(filtroFecha);
    enjoylifedb.transaction();
    if (!(gasto_mes_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();

    RefreshGastosMesView();
}

/**
 * @brief GastoMensualModule::RefreshModelView
 */
void GastoMensualModule::RefreshModelView()
{
    QString filtro_gasto = "(estado is null or estado <> 'BAJA')";

    gasto_mes_model->setTable("gasto_mes");
    gasto_mes_model->setFilter(filtro_gasto);

    enjoylifedb.transaction();
    if (! gasto_mes_model->select()) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();

    RefreshGastosMesView();
}

void GastoMensualModule::RefreshGastosMesView()
{
    gasto_mes_view->hideColumn(0);
    gasto_mes_view->hideColumn(7);
    gasto_mes_view->hideColumn(8);

    gasto_mes_model->setHeaderData(1,Qt::Horizontal,"Fecha Gasto");
    gasto_mes_model->setHeaderData(2,Qt::Horizontal,"Concepto");
    gasto_mes_model->setHeaderData(3,Qt::Horizontal,"Monto");
    gasto_mes_model->setHeaderData(4,Qt::Horizontal,"Estado Pago");
    gasto_mes_model->setHeaderData(5,Qt::Horizontal,"Tipo Gasto");
    gasto_mes_model->setHeaderData(6,Qt::Horizontal,"Observaciones");
//    gasto_mes_model->setHeaderData(8,Qt::Horizontal,"Estado");

    gasto_mes_view->setModel(gasto_mes_model);
    gasto_mes_view->setCornerButtonEnabled(true);
    gasto_mes_view->setAlternatingRowColors(true);
    gasto_mes_view->setGridStyle(Qt::SolidLine);
    gasto_mes_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    gasto_mes_view->setWordWrap(true);
    gasto_mes_view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    gasto_mes_view->sortByColumn(1,Qt::SortOrder());
    gasto_mes_view->scrollToBottom();
}

void GastoMensualModule::ActualizarValoresGastosMes()
{
    // Gasto total mes
    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString str;
    str.append("select sum(monto) from gasto_mes where (estado is null or estado <> 'BAJA')"); //where (EXTRACT(MONTH from fecha_gasto)) = '");
//    str.append(QString::number(QDate::currentDate().month())).append("'");

    if (! query->exec(str)) {
        QMessageBox::critical(this,"Error en la consulta",query->lastError().text());
        return;
    }

    double suma_gastos = -1;
    double gastos_divididos = -1;
    while (query->next())
        suma_gastos = query->value(0).toDouble();

    gastos_divididos = (suma_gastos / 3);

    const int precision = 2;
    gasto_mes_edit->clear();
    gasto_mes_edit->setText(QString("%1").arg(suma_gastos, 0, 'f', precision));

    // Gastos Pablo
    QSqlQuery *queryGastosPablo = new QSqlQuery(enjoylifedb);
    QString strGastosPablo;
    strGastosPablo.append("select sum(monto) from gasto_mes where (estado is null or estado <> 'BAJA') and quien_pago like '%");
    strGastosPablo.append("Pablo%'");/*.append("%' and (EXTRACT(MONTH from fecha_gasto)) = '");
    strGastosPablo.append(QString::number(QDate::currentDate().month())).append("'");*/
    if (! queryGastosPablo->exec(strGastosPablo)) {
        QMessageBox::critical(this,"Error en la consulta",queryGastosPablo->lastError().text());
        return;
    }

    double gastos_pablo = -1;
    while (queryGastosPablo->next())
        gastos_pablo = queryGastosPablo->value(0).toDouble();

    gasto_mes_pablo_edit->clear();
    gasto_mes_pablo_edit->setText(QString("%1").arg(gastos_pablo, 0, 'f', precision));

    // Gastos Lucas
    QSqlQuery *queryGastosLucas = new QSqlQuery(enjoylifedb);
    QString strGastosLucas;
    strGastosLucas.append("select sum(monto) from gasto_mes where (estado is null or estado <> 'BAJA') and quien_pago like '%");
    strGastosLucas.append("Lucas%'");/*.append("%' and (EXTRACT(MONTH from fecha_gasto)) = '");
    strGastosPablo.append(QString::number(QDate::currentDate().month())).append("'");*/
    if (! queryGastosLucas->exec(strGastosLucas)) {
        QMessageBox::critical(this,"Error en la consulta",queryGastosLucas->lastError().text());
        return;
    }

    double gastos_lucas = -1;
    while (queryGastosLucas->next())
        gastos_lucas = queryGastosLucas->value(0).toDouble();

    gasto_mes_lucas_edit->clear();
    gasto_mes_lucas_edit->setText(QString("%1").arg(gastos_lucas, 0, 'f', precision));

    // Gastos Diego
    QSqlQuery *queryGastosDiego = new QSqlQuery(enjoylifedb);
    QString strGastosDiego;
    strGastosDiego.append("select sum(monto) from gasto_mes where (estado is null or estado <> 'BAJA') and quien_pago like '%");
    strGastosDiego.append("Diego%'");/*.append("%' and (EXTRACT(MONTH from fecha_gasto)) = '");
    strGastosPablo.append(QString::number(QDate::currentDate().month())).append("'");*/
    if (! queryGastosDiego->exec(strGastosDiego)) {
        QMessageBox::critical(this,"Error en la consulta",queryGastosDiego->lastError().text());
        return;
    }

    double gastos_diego = -1;
    while (queryGastosDiego->next())
        gastos_diego = queryGastosDiego->value(0).toDouble();

    gasto_mes_diego_edit->clear();
    gasto_mes_diego_edit->setText(QString("%1").arg(gastos_diego, 0, 'f', precision));

    //**************************************************************************
    double dif_gasto_pablo = gastos_pablo - gastos_divididos;
    double dif_gasto_lucas = gastos_lucas - gastos_divididos;
    double dif_gasto_diego = gastos_diego - gastos_divididos;

    deuda_mes_edit->clear();
    debe_pablo_edit->clear();
    debe_lucas_edit->clear();
    debe_diego_edit->clear();
    // Deuda de pablo
    if (dif_gasto_pablo >= 0) {
        debe_pablo_edit->setText(QString("%1").arg(dif_gasto_pablo, 0, 'f', precision));
        debe_pablo_edit->setStyleSheet("background-color: rgb(13, 200, 35);color: rgb(0, 0, 0);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    } else {
        debe_pablo_edit->setText(QString("%1").arg(dif_gasto_pablo, 0, 'f', precision));
        debe_pablo_edit->setStyleSheet("background-color: rgb(13, 200, 35);color: rgb(255, 0, 0);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    }
    // Deuda de lucas
    if (dif_gasto_lucas >= 0) {
        debe_lucas_edit->setText(QString("%1").arg(dif_gasto_lucas, 0, 'f', precision));
        debe_lucas_edit->setStyleSheet("background-color: rgb(13, 200, 35);color: rgb(0, 0, 0);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    }
    else {
        debe_lucas_edit->setText(QString("%1").arg(dif_gasto_lucas, 0, 'f', precision));
        debe_lucas_edit->setStyleSheet("background-color: rgb(13, 200, 35);color: rgb(255, 0, 0);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    }
    // Deuda de Diego
    if (dif_gasto_diego >= 0) {
        debe_diego_edit->setText(QString("%1").arg(dif_gasto_diego, 0, 'f', precision));
        debe_diego_edit->setStyleSheet("background-color: rgb(13, 200, 35);color: rgb(0, 0, 0);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    }
    else {
        debe_diego_edit->setText(QString("%1").arg(dif_gasto_diego, 0, 'f', precision));
        debe_diego_edit->setStyleSheet("background-color: rgb(13, 200, 35);color: rgb(255, 0, 0);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    }

    // Deuda Total Mes
    QSqlQuery* queryDeudaTotalMes = new QSqlQuery(enjoylifedb);
    QString strDeudaTotalMes;
    strDeudaTotalMes.append("select sum(monto) from gasto_mes where (estado is null or estado <> 'BAJA') and estado_pago = 'Debe'"); // and ");
//    strDeudaTotalMes.append("(EXTRACT(MONTH from fecha_gasto)) = '");
//    strDeudaTotalMes.append(QString::number(QDate::currentDate().month())).append("'");

    if (! queryDeudaTotalMes->exec(strDeudaTotalMes)) {
        QMessageBox::critical(this,"Error en la consulta",queryDeudaTotalMes->lastError().text());
        return;
    }

    double suma_saldo2 = -1;
    while (queryDeudaTotalMes->next())
        suma_saldo2 = queryDeudaTotalMes->value(0).toDouble();

    deuda_mes_edit->setText(QString("%1").arg(suma_saldo2, 0, 'f', precision));
}

void GastoMensualModule::ActualizarValoresGastosMesFiltro()
{
    //    QDate date;
    //    date.setDate(fecha_gasto->date().year(), fecha_gasto->date().month(), fecha_gasto->date().day());
    //    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    //    QString str;
    //    str.append("select sum(monto) from gasto_mes where (EXTRACT(MONTH from fecha_gasto)) = '");
    //    str.append(QString::number(date.month())).append("'");

    //    if (! query->exec(str)) {
    //        QMessageBox::critical(this,"Error en la consulta",query->lastError().text());
    //        return;
    //    }

    //    double suma_gastos = -1;
    //    while (query->next())
    //        suma_gastos = query->value(0).toDouble();

    //    const int precision = 2;
    //    gasto_mes_edit->clear();
    //    gasto_mes_edit->setText(QString("%1").arg(suma_gastos, 0, 'f', precision));

    //    //**************************************************************************

    //    QSqlQuery *query2 = new QSqlQuery(enjoylifedb);
    //    QString str2;
    //    str2.append("select sum(monto) from gasto_mes where quien_pago like '%");
    //    str2.append(current_user).append("%' and (EXTRACT(MONTH from fecha_gasto)) = '");
    //    str2.append(QString::number(date.month())).append("'");
    //    if (! query2->exec(str2)) {
    //        QMessageBox::critical(this,"Error en la consulta",query2->lastError().text());
    //        return;
    //    }

    //    double suma_saldo1 = -1;
    //    while (query2->next())
    //        suma_saldo1 = query2->value(0).toDouble();

    //    double gasto_pablo = -1;
    //    double gasto_lucas = -1;

    //    if (current_user == user_pablo) {
    //        gasto_pablo = suma_saldo1;
    //        gasto_lucas = suma_gastos - suma_saldo1;
    //    }
    //    else {
    //        gasto_pablo = suma_gastos - suma_saldo1;
    //        gasto_lucas = suma_saldo1;
    //    }

    //    gasto_mes_pablo_edit->clear();
    //    gasto_mes_lucas_edit->clear();
    //    gasto_mes_pablo_edit->setText(QString("%1").arg(gasto_pablo, 0, 'f', precision));
    //    gasto_mes_lucas_edit->setText(QString("%1").arg(gasto_lucas, 0, 'f', precision));

    //    //**************************************************************************
    //    double dif_gasto_pablo = (suma_gastos / 2) - gasto_pablo;
    //    double dif_gasto_lucas = (suma_gastos / 2) - gasto_lucas;

    //    debe_lucas_edit->clear();
    //    debe_pablo_edit->clear();
    //    // Deuda de pablo
    //    if (dif_gasto_pablo <= 0) {
    //        debe_pablo_edit->setText(QString("%1").arg(0, 0, 'f', precision));
    //        debe_pablo_edit->setStyleSheet("background-color: rgb(0, 139, 56);color: rgb(255, 255, 255);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    //    }
    //    else {
    //        debe_pablo_edit->setText(QString("%1").arg(dif_gasto_pablo, 0, 'f', precision));
    //        debe_pablo_edit->setStyleSheet("background-color: rgb(0, 139, 56);color: rgb(240, 0, 0);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    //    }

    //    // Deuda de lucas
    //    if (dif_gasto_lucas <= 0) {
    //        debe_lucas_edit->setText(QString("%1").arg(0, 0, 'f', precision));
    //        debe_lucas_edit->setStyleSheet("background-color: rgb(0, 139, 56);color: rgb(255, 255, 255);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    //    }
    //    else {
    //        debe_lucas_edit->setText(QString("%1").arg(dif_gasto_lucas, 0, 'f', precision));
    //        debe_lucas_edit->setStyleSheet("background-color: rgb(0, 139, 56);color: rgb(240, 0, 0);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    //    }

    //    QSqlQuery* query3 = new QSqlQuery(enjoylifedb);
    //    QString str3;
    //    str3.append("select sum(monto) from gasto_mes where estado_pago = 'Debe' and ");
    //    str3.append("(EXTRACT(MONTH from fecha_gasto)) = '");
    //    str3.append(QString::number(date.month())).append("'");

    //    if (! query3->exec(str3)) {
    //        QMessageBox::critical(this,"Error en la consulta",query3->lastError().text());
    //        return;
    //    }

    //    double suma_saldo2 = -1;
    //    while (query3->next())
    //        suma_saldo2 = query3->value(0).toDouble();

    //    monto_deuda_edit->setText(QString("%1").arg(suma_saldo2, 0, 'f', precision));
}

// Filtros
void GastoMensualModule::FiltrarGastosLucas()
{
    //    find_line->clear();
    //    QDate date;
    //    QString formatoMes = "MM";
    //    QString formatoAnio = "yyyy";
    //    QString mes = date.currentDate().toString(formatoMes);
    //    QString anio = date.currentDate().toString(formatoAnio);

    //    QString filtro = "date_part('month',fecha_gasto) = '";
    //    filtro.append(mes).append("' ");
    //    filtro.append("and date_part('year',fecha_gasto) = '").append(anio).append("' ");
    //    filtro.append("and quien_pago = 'Lucas'");

    //    gasto_mes_model->setTable("gasto_mes");
    //    gasto_mes_model->setFilter(filtro);
    //    if (!gasto_mes_model->select()) {
    //        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
    //        enjoylifedb.rollback();
    //        return;
    //    }
    //    enjoylifedb.commit();
    //    RefreshGastosMesView();
}

void GastoMensualModule::FiltrarGastosPablo()
{
    //    find_line->clear();
    //    QDate date;
    //    QString formatoMes = "MM";
    //    QString formatoAnio = "yyyy";
    //    QString mes = date.currentDate().toString(formatoMes);
    //    QString anio = date.currentDate().toString(formatoAnio);

    //    QString filtro = "date_part('month',fecha_gasto) = '";
    //    filtro.append(mes).append("' ");
    //    filtro.append("and date_part('year',fecha_gasto) = '").append(anio).append("' ");
    //    filtro.append("and quien_pago = 'Pablo'");

    //    gasto_mes_model->setTable("gasto_mes");
    //    gasto_mes_model->setFilter(filtro);
    //    if (!gasto_mes_model->select()) {
    //        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
    //        enjoylifedb.rollback();
    //        return;
    //    }
    //    enjoylifedb.commit();
    //    RefreshGastosMesView();
}

void GastoMensualModule::FiltrarConcepto()
{
//    if (find_concepto->isChecked()) {
//        find_observacion->setChecked(false);
//        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(EncontrarObservacion()));
//        find_line->setEnabled(true);
//        connect(find_line,SIGNAL(returnPressed()),this,SLOT(EncontrarConcepto()));
//    }
//    else
//        find_line->setEnabled(false);
}

void GastoMensualModule::EncontrarConcepto()
{
    //    if (!find_line->text().isEmpty()) {
    //        QDate date;
    //        QString formatoMes = "MM";
    //        QString formatoAnio = "yyyy";
    //        QString mes = date.currentDate().toString(formatoMes);
    //        QString anio = date.currentDate().toString(formatoAnio);

    //        QString filtro = "date_part('month',fecha_gasto) = '";
    //        filtro.append(mes).append("' ");
    //        filtro.append("and date_part('year',fecha_gasto) = '").append(anio).append("' ");
    //        filtro.append("and concepto ilike '%").append(find_line->text()).append("%'");

    //        gasto_mes_model->setTable("gasto_mes");
    //        gasto_mes_model->setFilter(filtro);
    //        if (!gasto_mes_model->select()) {
    //            QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
    //            enjoylifedb.rollback();
    //            return;
    //        }
    //        enjoylifedb.commit();
    //        RefreshGastosMesView();
    //    } else {
    //        RefreshModelView();
    //    }
}

void GastoMensualModule::FiltrarObservacion()
{
    //    if (find_observacion->isChecked()) {
    //        find_concepto->setChecked(false);
    //        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(EncontrarConcepto()));
    //        find_line->setEnabled(true);
    //        connect(find_line,SIGNAL(returnPressed()),this,SLOT(EncontrarObservacion()));
    //    }
    //    else
    //        find_line->setEnabled(false);
}

void GastoMensualModule::EncontrarObservacion()
{
    //    if (!find_line->text().isEmpty()) {
    //        QDate date;
    //        QString formatoMes = "MM";
    //        QString formatoAnio = "yyyy";
    //        QString mes = date.currentDate().toString(formatoMes);
    //        QString anio = date.currentDate().toString(formatoAnio);

    //        QString filtro = "date_part('month',fecha_gasto) = '";
    //        filtro.append(mes).append("' ");
    //        filtro.append("and date_part('year',fecha_gasto) = '").append(anio).append("' ");
    //        filtro.append("and observaciones ilike '%").append(find_line->text()).append("%'");

    //        gasto_mes_model->setTable("gasto_mes");
    //        gasto_mes_model->setFilter(filtro);
    //        if (!gasto_mes_model->select()) {
    //            QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
    //            enjoylifedb.rollback();
    //            return;
    //        }
    //        enjoylifedb.commit();
    //        RefreshGastosMesView();
    //    } else {
    //        RefreshModelView();
    //    }
}

void GastoMensualModule::FiltrarGastosFecha()
{
    //    QString formatoAnio = "yyyy";
    //    QString formatoMes = "MM";
    //    QString anio, mes;
    //    anio = fecha_gasto->date().toString(formatoAnio);
    //    mes = fecha_gasto->date().toString(formatoMes);
    //    QString filtro;
    //    filtro = "date_part('year', fecha_gasto) = '" + anio + "'";
    //    filtro = filtro + " and date_part('month', fecha_gasto) = '" + mes + "'";

    //    enjoylifedb.transaction();
    //    gasto_mes_model->setTable("gasto_mes");
    //    gasto_mes_model->filter().clear();
    //    gasto_mes_model->setFilter(filtro);
    //    if (!(gasto_mes_model->select())) {
    //        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
    //        enjoylifedb.rollback();
    //        return;
    //    }
    //    enjoylifedb.commit();
    //    ActualizarValoresGastosMesFiltro();
    //    RefreshGastosMesView();
}
